/*!
 * 文件名称： driver_rtc.c
 * 描    述： rtc 驱动文件
 * 版本：     2023-12-03, V1.0
*/

/*
* GD32F303东方红开发板V1.0
* 淘宝商城：   https://juwo.taobao.com
* 技术交流：   https://www.gd32bbs.com/ask/
* 视频学习：   https://space.bilibili.com/475462605
* 微信公众号： gd32bbs
* Copyright    苏州聚沃电子科技有限公司
* 版权所有，盗版必究。
*/

#include "driver_rtc.h"

/*!
* 说明     rtc配置函数
* 输入     无
* 返回值   无
*/
void rtc_configuration(void)
{
		rcu_periph_clock_enable(RCU_BKPI);						/*使能备份域和PMU时钟*/
		rcu_periph_clock_enable(RCU_PMU);

		pmu_backup_write_enable();										/*使能备份域写功能*/
		bkp_deinit();																	/*备份域复位*/
		/*依据选择的时钟源进行时钟配置*/
		#ifdef RTC_CLOCK_SOURCE_LXTAL									/*使用LXTAL*/
		rcu_osci_on(RCU_LXTAL);												/* 使能 LXTAL */
		rcu_osci_stab_wait(RCU_LXTAL);								/* 等待LXTAL Ready */
		rcu_rtc_clock_config(RCU_RTCSRC_LXTAL);				/*选择LXTAL作为RTC时钟*/

		#endif
		#ifdef RTC_CLOCK_SOURCE_IRC40K								/*使用IRC40K*/

		rcu_osci_on(RCU_IRC40K);											/* 使能 IRC40K*/

		rcu_osci_stab_wait(RCU_IRC40K);								/* 等待IRC40K Ready */

		rcu_rtc_clock_config(RCU_RTCSRC_IRC40K);			/*选择IRC40K作为RTC时钟*/
		#endif
		#ifdef RTC_CLOCK_SOURCE_HXTAL_DIV_128
		rcu_osci_on(RCU_HXTAL);												/* 使能LXTAL */
		rcu_osci_stab_wait(RCU_HXTAL);								/* 等待HXTAL Ready */
		rcu_rtc_clock_config(RCU_RTCSRC_HXTAL_DIV_128);	/*选择HXTAL/128作为RTC时钟*/
		#endif
		rcu_periph_clock_enable(RCU_RTC);							/*使能RTC时钟*/
		rtc_register_sync_wait();											/*等待RTC寄存器同步*/
		rtc_lwoff_wait();															/*等待上一次操作完成*/
		rtc_interrupt_enable(RTC_INT_SECOND);					/*使能RTC秒中断*/
		rtc_lwoff_wait();															/*等待上一次操作完成*/
		/*依据选择的时钟源来设置分频，使RTC周期为1s*/
		#ifdef RTC_CLOCK_SOURCE_LXTAL
		rtc_prescaler_set(32767);
		#endif
		#ifdef RTC_CLOCK_SOURCE_IRC40K
		rtc_prescaler_set(40000);
		#endif
		#ifdef RTC_CLOCK_SOURCE_HXTAL_DIV_128
		rtc_prescaler_set(HXTAL_VALUE/128);
		#endif
		rtc_lwoff_wait();															/*等待上一次操作完成*/
}
